package com.cskaoyan._04dielock;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/22 14:39
 **/
/*
同步代码块嵌套
synchronized(objA){
    synchronized(objB){

}
}

解决死锁:
1.使加锁的顺序保持一致
 */
public class Demo2 {
    public static void main(String[] args) {
        new Thread(new DieLock2(true)).start();
        new Thread(new DieLock2(false)).start();
    }
}

// 定义一个锁类
class MyLock2{
    public static final Object OBJECTA = new Object();
    public static final Object OBJECTB = new Object();
}

class DieLock2 implements Runnable{
    // 定义一个flag
    boolean flag;

    public DieLock2(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if (flag) {
            // 假设A线程执行
            synchronized (MyLock2.OBJECTA) {
                // A持有A锁,A线程进来
                System.out.println("if A");

                // A线程想要访问里层的sync, 发生了线程切换-->B线程
                // A只能等待
                synchronized (MyLock2.OBJECTB) {
                    System.out.println("if b");
                }
            }
        }else {
            // B线程执行 想要访问外层的sync B锁可用
            synchronized (MyLock2.OBJECTA) {
                // B线程持有了B锁 进入外层sync
                System.out.println("else B");
                // B线程没有A锁 B只能等待
                synchronized (MyLock2.OBJECTB) {
                    System.out.println("else A");
                }
            }
        }
    }
}